package persistencia.carreras.ensambladores;

import compartido.IEntidad;

import persistencia.IAlmacen;
import persistencia.IEnsamblador;
import persistencia.IIngrediente;
import persistencia.IProducto;
import persistencia.compartido.ProductoSinValores;
import persistencia.compartido.Tipo;
import persistencia.excepciones.EscritorIncompatible;
import persistencia.excepciones.LectorIncompatible;
import persistencia.pruebas.EntidadEjemplo;

public class EnsambladorIdentificador implements IEnsamblador {
	@Override
	public boolean esComptabile(IProducto p) {
		return true;
	}

	@Override
	public boolean esCompatible(IEntidad e) {
		return (e instanceof Identificador);
	}
	
	@Override
	public IEntidad leer(IProducto p, IAlmacen almacen) throws LectorIncompatible {
		if (!esComptabile(p))
			throw new LectorIncompatible();
		
		String clase = p.getNombre();		
		IIngrediente idActual = p.obtenerIngrediente("idActual");
		
		Identificador id = new Identificador(clase,Long.valueOf(idActual.getValor()));
		return id;
	}

	@Override
	public IProducto escribir(IEntidad e, IAlmacen almacen) throws EscritorIncompatible {
		if (!esCompatible(e))
			throw new EscritorIncompatible();
		
		Identificador id = (Identificador)e;
		
		IProducto copia = almacen.crearProducto("clase",id.getIdentificador(), new Tipo<IEntidad>(Identificador.class));
		IIngrediente idActual = almacen.crearIngrediente("idActual",String.valueOf(id.getIdActual()));
		if (!copia.agregar(idActual))
			copia.modificar(idActual);
		
		return copia;
	}

	@Override
	public IProducto getDummy(Tipo<IEntidad> tipo) throws EscritorIncompatible {
		/*
		 * Aca se puede usar cualquier tipo de producto.
		 */
		Tipo<IEntidad> acepta = new Tipo<IEntidad>(EntidadEjemplo.class);
		if (!acepta.esSuperTipoDe(tipo))
			throw new EscritorIncompatible();
		
		ProductoSinValores producto = new ProductoSinValores();
		producto.agregarCampo("clase");
		producto.agregarCampo("idActual");
		return producto;
	}
}
